# Простые задачи

## Недостатки юзабилити, если пользователь не может прочитать конфиг клиента.

`programs/client/Client.cpp`

Делаем `chmod 000 /etc/clickhouse-client/config.xml` и смотрим, что получится.

## + Уменьшать max_memory_usage, если на сервере мало оперативки.

Смотрим, сколько на сервере оперативки. Если `max_memory_usage`, `max_memory_usage_for_all_queries` ограничены, но больше 90% (настройка) от имеющейся оперативки, то уменьшать их и выводить предупреждение в лог..

`programs/server/Server.cpp` - инициализация сервера, установка размера кэшей

`getMemoryAmount.h` - информация о доступной оперативке

`context.setSetting` - для выставления `max_memory_usage` и других.

## + Битовые операции для FixedString.

bitAnd, bitOr, bitNot, bitXor для значения типа FixedString, интерпретируемого как набор бит.

Сделайте сначала в C++ побитовые функции для работы с куском памяти:
```
void memoryBitAnd(const char * a, const char * b, char * result, size_t size);
```
Потом используйте их в вашей функции.

## + Добавить generic вариант функций least, greatest.

`SELECT least(123, 456)` - работает.

`SELECT least('123', '456')` - не работает. Надо сделать.

Делаем с помощью `IColumn::compareAt` для одинаковых типов и с помощью `castColumn`, `getLeastSuperType` для разных.

## При ATTACH кусков, проверять владельца файлов.

Смотрим, что все файлы в прикрепляемых кусках от правильного пользователя.

## + COLLATE должно работать для Nullable(String).

В ClickHouse есть возможность указать collation для сортировки строк. Это не работает для `Nullable(String)`.

## + Запретить чтение значений типа AggregateFunction по-умолчанию и добавить настройку.

Состояния агрегатных функций могут быть записаны в дамп и считаны из него. Но десериализация состояний агрегатных функций небезопасна. Аккуратно выбранные пользовательские данные могут привести к segfault или порче памяти. Поэтому нужно просто сделать настройку, которая запрещает читать AggregateFunction из пользовательских данных.

Upd: сделали по-другому: теперь всё безопасно.

## + В статистику jemalloc добавить информацию по arenas.

В `system.asynchronous_metrics` - суммарный размер арен.

# Более сложные задачи

## + Layout внешних словарей "direct".

Как cache, но без кэша — всегда прямой запрос в источник.

## + Функции randomFixedString, randomBinaryString, fuzzBits, fuzzBytes.

## + Агрегатные функции для статистических тестов (e.g. тест нормальности распределения) и статистик.

## + Функции создания и обновления состояния агрегатной функции по одному кортежу аргументов.

В ClickHouse есть понятие - состояние вычисления агрегатной функции. Состояния агрегатных функций можно записывать в таблицы, складывать, финализировать и т. п. https://clickhouse.com/docs/ru/data_types/nested_data_structures/aggregatefunction/

Получить состояние агрегатной функции можно с помощью комбинатора State: https://clickhouse.com/docs/ru/query_language/agg_functions/combinators/#-state Но хотелось бы добавить ещё более простой способ получения состояния агрегатной функции.

Например:

`createAggregationState('groupArray')` - создать пустое (начальное) состояние агрегатной функции.

`createAggregationState('groupArray', 1)` - создать состояние агрегатной функции, в котором агрегировано одно значение 1.

`createAggregationState('argMax', ('hello', 123))` - то же самое для агрегатных функций, принимающих несколько аргументов.

## LEFT ONLY JOIN

## Функции makeDate, makeDateTime.

`makeDate(year, month, day)`
`makeDateTime(year, month, day, hour, minute, second, [timezone])`

## Функции changeYear, changeMonth, ...

`changeYear(datetime, 2019)`

## + Исправить мерцание прогресс-бара в clickhouse-client.

Это заметно при работе с серверами с большим пингом.
Прогресс бар не должен мерцать.
Наверное, надо просто вместо очистки строки, перемещать курсор в начало, не очищая её.

## Функция rowNumberForKey.

Возвращает инкрементальное число для повторно встречающихся значений key.

## Агрегатная функция groupConcat.

`groupConcat(x, ',')` - собрать из переданных значений x строку, разделённую запятыми.

## Функции DATE_ADD, DATE_SUB как синонимы для совместимости с SQL.

https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_date-add

## Функции positionReverse, positionUTF8Reverse, positionCaseInsensitiveReverse, positionCaseInsensitiveUTF8Reverse.

position с конца строки.

## + Функция indexOf должна поддерживать Enum-ы без cast-а.

`indexOf(arr, 'hello')`, `indexOf(arr, 1)` должны работать, если arr имеет тип `Array(Enum8('hello' = 1, 'world' = 2))`

## + Комбинатор агрегатных функций Distinct.

Пример: `avgDistinct(x)` - вычислить среднее по всем различным переданным значениям.

## + Метрики количества ошибок.

Добавляем счётчики всех ошибок (ErrorCodes) по аналогии с ProfileEvents. Кроме количества запоминаем также время последней ошибки, стек трейс, сообщение. Добавляем системную таблицу system.errors. Отправка в Graphite.

## + Добавить Lizard, LZSSE и density в качестве вариантов алгоритмов сжатия.

Экспериментальные алгоритмы сжатия. Сейчас ClickHouse поддерживает только lz4 и zstd.

## + Запрос CREATE OR REPLACE TABLE

Атомарно удаляет таблицу перед созданием новой, если такая была.

## + Приведение типов для IN (subquery).

`SELECT 1 IN (SELECT -1 UNION ALL SELECT 1)`

- сейчас не работает.

## Возможность вставки значений типа AggregateFunction в виде кортежа значений аргументов, а не бинарного дампа состояния, под настройкой.

Во входных данных в запросе INSERT должна быть возможность передать значение типа AggregateFunction не в виде сериализованного состояния, а в виде аргументов, которые будут агрегированы, для формирования этого состояния.

## Возможность использовать ALIAS столбцы при INSERT.

https://clickhouse.com/docs/en/query_language/create/#create-table

`INSERT INTO table (column1, column2, ...)`

- если column - это ALIAS столбец, и если выражение для ALIAS тривиально (просто ссылается на другой столбец), то разрешить использовать его вместо другого столбца в запросе INSERT.

## Запрос ALTER TABLE LOCK/UNLOCK PARTITION.

Запретить модификацию данных в партиции. На партицию ставится флаг, что она заблокирована. В неё нельзя делать INSERT и ALTER. С файлов снимается доступ на запись.

Upd: не нужно.

## Настройка join_use_nulls: поддержка для LEFT ARRAY JOIN.

## + Внешние словари из Aerospike/Couchbase/Cassandra (на выбор).

Подключить одну из key-value БД как источник.

Upd: сделали Redis, Cassandra, MongoDB.

## + Движок таблиц Mongo, табличная функция mongo.

Возможность легко импортировать данные из MongoDB.

## Корректная обработка multiline значений в Pretty форматах.
SELECT 'hello\nworld' AS x, 123 AS y
```
┌─x──────────┬───y─┐
│ hello
world │ 123 │
└────────────┴─────┘
```
А надо так:
```
┌─x─────┬───y─┐
│ hello…│ 123 │
│…world │     │
└───────┴─────┘
```

## Работоспособность внешних данных на время сессии.

https://clickhouse.com/docs/en/operations/table_engines/external_data/

Не работает, если открыть clickhouse-client в интерактивном режиме и делать несколько запросов.

## + Настройка для возможности получить частичный результат при cancel-е.

Хотим по Ctrl+C получить те данные, которые успели обработаться.

## Раскрытие кортежей в функциях высшего порядка.

## Табличная функция loop.

`SELECT * FROM loop(database, table)`

Читает данные из таблицы в бесконечном цикле.

## Возможность ATTACH партиции с меньшим или большим количеством столбцов.

## + Поддержка неконстантного аргумента с тайм-зоной у некоторых функций для работы с датой и временем.

## + Возможность задавать параметры соединений для табличных функций, движков таблиц и для реплик из отдельных разделов конфигурации.

## + Настройка rollup_use_nulls.

Upd: it is named "group_by_use_nulls".

## + Настройка cast_keep_nullable.

## Функция bitEquals для сравнения произвольных типов данных побитово

## Функция serialize для implementation specific non portable non backwards compatible сериализации любого типа данных в набор байт.
